﻿using System;

namespace NearAop
{

    /// <summary>
    /// 属性代理,Set Get方法处理程序
    /// </summary>
    public interface IAopHandlerProperty : IAopHandlerPropertySet, IAopHandlerPropertyGet
    {
    }

    /// <summary>
    /// 属性代理,SET方法处理程序
    /// </summary>
    public interface IAopHandlerPropertySet
    {
        /// <summary>
        /// 用于接管被代理的目标类中的成员属性set方法
        /// </summary>
        /// <typeparam name="T">属性类型</typeparam>
        /// <param name="aopParamInfo">属性信息</param>
        /// <param name="value">新值</param>
        /// <param name="getValue">取值委托</param>
        /// <param name="setValue">赋值委托</param>
        /// <param name="sender">引发变更的源</param>

        void PropertySetHandler<T>(Lazy<AopParamInfo> aopParamInfo, object sender, T value, Func<T> getValue, Action<T> setValue);
    }

    /// <summary>
    /// 属性代理,Get方法处理程序
    /// </summary>
    public interface IAopHandlerPropertyGet
    {
        /// <summary>
        /// 用于接管被代理的目标类中的成员属性方法
        /// </summary>
        /// <typeparam name="T">属性类型</typeparam>
        /// <param name="aopParamInfo">属性信息</param>
        /// <param name="getValue">属性原Get方法调用过程</param>
        /// <param name="sender">引发变更的源</param>
        T PropertyGetHandler<T>(Lazy<AopParamInfo> aopParamInfo, object sender, Func<T> getValue);
    }

    /// <summary>
    /// 属性代理,本地模式(无须标记特性)
    /// </summary>
    public interface IAopHandlerPropertyLocal : IAopHandlerProperty { }

    /// <summary>
    /// 属性代理,本地模式,SET方法处理程序(无须标记特性)
    /// </summary>
    public interface IAopHandlerPropertySetLocal : IAopHandlerPropertySet { }

    /// <summary>
    /// 属性代理,本地模式,GET方法处理程序(无须标记特性)
    /// </summary>
    public interface IAopHandlerPropertyGetLocal : IAopHandlerPropertyGet { }
}

